#include<assert.h>
#include<stdio.h>
int my_memcmp(const void* p1,const void* p2,size_t count)
{
  assert(p1 && p2);
  //比较前count个字节
  while(count--)
  {
    if(*(char*)p1 == *(char*)p2)
    {
      p1 = (char*)p1+1; //不建议写成:p1 = (char*)p1++  防止编译器报错
      p2 = (char*)p2+1;
    }
    else 
    {
      //根据字节内容比较谁大
      if(*(char*)p1 - *(char*)p2 > 0)
        return 1;
      else //这里为<0  不是<=0,因为二者相等的话,不会走到else
        return -1;
    }
  }
  return 0; //说明二者前count个字节的内容相同
}
void* my_memcpy(void* p1,const void* p2,size_t count)
{
  assert(p1 && p2);
  void* ret = p1;
  while(count--)
  {
    *(char*)p1 = *(char*)p2;
    p1 = (char*)p1 + 1;
    p2 = (char*)p2 + 1;
  }
  return ret;
}
//和memcpy的区别：可以处理内存重叠的问题
void* my_memmove(void* dest,const void* src,size_t count)
{
  assert(dest && src);
  void* ret = dest;
  //dest < src  ------[ ---[-- ]------]
  //                 dest  src
  //    此时需要从前往后进行拷贝
  if((char*)dest < (char*)src) //void类型指针不能直接比较
  {
     while(count--)
     {
       *(char*)dest = *(char*)src;
       dest = (char*)dest + 1;
       src = (char*)src + 1;
     }
  }
  else  //从后往前拷贝
  {
    while(count--)
    {
      *((char*)dest+count) = *((char*)src + count);
    }
  }
  return ret;
}
void* my_memset1(void* dest,int c,size_t count)
{
  assert(dest);
  void* ret = dest;
  char set_c = (char)c;
  while(count--)
  {
    *(char*)dest = set_c;
    dest = (char*)dest + 1;
  }
  return ret;
}
void* my_memset2(void* dest,char c,size_t count)
{
  assert(dest);
  void* ret = dest;
  while(count--)
  {
    *(char*)dest = c - '0';
    dest = (char*)dest;
  }
  return ret;
}
int main()
{

  return 0;
}
